const Router = require('koa-router')
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
const { pool } = require('../config/db')
const { JWT_SECRET, JWT_EXPIRES_IN } = require('../config/jwt')

const router = new Router()

// 注册接口
router.post('/register', async ctx => {
  const { username, password } = ctx.request.body
  if (!username || !password) {
    ctx.status = 400
    ctx.body = { message: '用户名和密码必填' }
    return
  }

  try {
    const [rows] = await pool.query('SELECT * FROM users WHERE username = ?', [username])
    console.log('登录查询结果:', rows) // 输出查询到的用户数据
    if (rows.length > 0) {
      ctx.status = 409
      ctx.body = { message: '用户已存在' }
      return
    }

    // 使用bcrypt对密码进行哈希加密，盐值轮数为10
    const hashedPassword = await bcrypt.hash(password, 10)
    // 将用户名和加密后的密码插入到users表中
    await pool.query('INSERT INTO users (username, password) VALUES (?, ?)', [username, hashedPassword])
    ctx.status = 201
    ctx.body = { message: '注册成功' }
  } catch (err) {
    console.error('注册失败:', err)
    ctx.status = 500
    ctx.body = { message: '服务器内部错误' }
  }
})

// 登录接口
router.post('/login', async ctx => {
  const { username, password } = ctx.request.body
  try {
    const [rows] = await pool.query('SELECT * FROM users WHERE username = ?', [username])
    if (rows.length === 0) {
      // 404会暴露用户名是否存在的信息，而401表示认证失败，不会泄露具体的失败原因
      ctx.status = 401
      // 安全性考虑：这里故意使用模糊的错误信息 '用户名或密码错误'，而不是明确告诉用户"用户名不存在"。这样做是为了防止恶意用户通过枚举用户名来探测系统中存在的用户。
      ctx.body = { message: '用户名或密码错误' }
      return
    }

    const isPasswordValid = await bcrypt.compare(password, rows[0].password)
    if (!isPasswordValid) {
      ctx.status = 401
      ctx.body = { message: '用户名或密码错误' }
      return
    }

    const token = jwt.sign({ username, userId: rows[0].id }, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN })
    ctx.body = { token, userId: rows[0].id, message: '登录成功' }
  } catch (err) {
    console.error('登录失败:', err)
    ctx.status = 500
    ctx.body = { message: '服务器内部错误' }
  }
})

// 受保护接口
router.get('/protected', async ctx => {
  ctx.body = { message: '受保护接口，已验证通过', user: ctx.state.user }
})

module.exports = router